'''
Created on 13/10/2013

@author: daniel
'''
import listaEnlazada
import unittest


class Recorredor(object):
    '''
    decora una lista para recorrerla mas facilmente
    '''
    def __init__(self,lista):
        self.lista=lista

    def comenzar(self):
        self.actual=0

    def elemento(self):
        return self.lista.elemento(self.actual)
    
    def proximo(self):
        if(self.lista.getTamanio()>self.actual):self.actual+=1
        
    def fin(self):
        if (self.lista.getTamanio()-self.actual==0): return True
        return self.lista.esVacia()
    
    def agregar(self,elem):
        self.lista.agregar(elem,self.actual)
        
    def eliminar(self):
        return self.lista.eliminar(self.actual)
        


class Test(unittest.TestCase):


    def testName(self):
        self.assertIsInstance(Recorredor(34),Recorredor ,"Verifica creacion")
    
    def testComenzar(self):
        first=Recorredor(32)
        first.comenzar()
        self.assertEquals(first.actual,0,"verifica comienzo del recorrido")

    def testElemento(self):
        first=Recorredor(32)
        first.comenzar()
        self.assertEquals(first.actual,0,"verifica comienzo del recorrido")

    def testProximo(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        first.proximo()
        self.assertEquals(first.actual,1,"verifica comienzo del recorrido")

    def testFin(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.proximo()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.proximo()
        self.assertFalse(first.fin(),"Verifica nofin de la lista")
        first.proximo()
        self.assertTrue(first.fin(),"Verifica fin de la lista")
        first.comenzar()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.eliminar()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.eliminar()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.eliminar()
        self.assertTrue(first.fin(),"Verifica no fin de la lista")
        

    def testAgregar(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        first.proximo()
        first.agregar(56)
        self.assertEquals(lista1.elemento(1),56,"verifica elemento agregado")

    def testEliminar(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        self.assertEquals(first.actual,0,"verifica comienzo del recorrido")
        first.eliminar()
        self.assertFalse(first.fin(),"Verifica fin de la lista")
        first.eliminar()
        self.assertFalse(first.fin(),"Verifica fin de la lista")
        first.eliminar()
        self.assertTrue(first.fin(),"Verifica fin de la lista")
        

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()